package com.herench.bs.transfer;

import com.alibaba.fastjson.JSONObject;
import com.herench.bs.support.HttpClientSupport;
import org.apache.cxf.endpoint.Client;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.util.*;

/**
 * 患者预交金缴纳
 *
 * @author liuxiaohui
 * @date 2019/3/26
 */
public class DoPrePaymentsTransfer extends AbstractTransfer {
    public DoPrePaymentsTransfer(String method, Client client, String messageMethod) {
        super(method, client, messageMethod);
    }

    // 缴费金额
    public String amount = "";
    // 微信公众号注册手机号：微信消息推送用
    public String wxUserMobile = "";
    // 患者姓名：微信消息推送用
    public String patientName = "";
    // 住院号：微信消息推送用
    public String inpNo = "";
    // 患者ID：出Log用
    public String patientId = "";
    // 身份证号：出Log用
    public String idNo = "";
    // 流水号：出Log用
    public String streamNo = "";


    /**
     * 发送：微信前端JSON数据转换为HIS用的XML数据（微信前端==》HIS）
     * @param params
     * @return
     * @throws Exception
     */
    @Override
    public String toInvokeMessage(Map<String, Object> params) throws Exception {
        // 患者ID
        patientId = (String) params.get("patientId");
        // 住院次数
        String visitId = (String) params.get("visitId");
        // 缴费金额
        amount = (String) params.get("amount");
        // 缴费方式
        String payWay = (String) params.get("payWay");
        // 交易类型
        String transactType = (String) params.get("transactType");
        // 身份证号
        idNo = (String) params.get("idNo");
        // 窗口号
        String winNo = (String) params.get("winNo");
        // 卡号
        String cardNo = (String) params.get("cardNo");
        // 卡类型
        String cardType = (String) params.get("cardType");
        // 合同号
        String tranNo = (String) params.get("tranNo");
        // 支付类别
        String moneyType = (String) params.get("moneyType");
        // 流水号
        streamNo = (String) params.get("streamNo");
        // 批次号
        String batchCode = (String) params.get("batchCode");
        // 授权码
        String authorizationCode = (String) params.get("authorizationCode");
        // 终端编号
        String terminalNumber = (String) params.get("terminalNumber");
        // 银行编码
        String bankCode = (String) params.get("bankCode");
        // 银行名称
        String bankName = (String) params.get("bankName");
        // 参考号
        String reference = (String) params.get("reference");

        // 微信公众号注册手机号：微信消息推送用
        wxUserMobile = (String) params.get("wxUserMobile");
        // 患者姓名：微信消息推送用
        patientName = (String) params.get("patientName");
        // 住院号：微信消息推送用
        inpNo = (String) params.get("inpNo");


        // 交易ID：his的方法名
        Document document = getTplDoc(getMethod());

        // 将各个入参数设值（入参==》XML）
        Element dataRow = document.getRootElement().element("CommitData").addElement("Data").addElement("DataRow");
        Element dataRowPayment = document.getRootElement().element("CommitData").addElement("Payment").addElement("DataRow");

        // 患者ID
        dataRow.addAttribute("PATIENT_ID", patientId);
        // 住院次数
        dataRow.addAttribute("VISIT_ID", visitId);
        // 缴费金额
        dataRow.addAttribute("AMOUNT", amount);
        // 缴费方式
        dataRow.addAttribute("PAY_WAY", payWay);
        // 交易类型
        dataRow.addAttribute("TRANSACT_TYPE", transactType);
        // 身份证号
        dataRow.addAttribute("ID_NO", idNo);
        // 窗口号
        dataRow.addAttribute("WIN_NO", winNo);

        // 卡号
        dataRowPayment.addAttribute("CARD_NO", cardNo);
        // 卡类型
        dataRowPayment.addAttribute("CARD_TYPE", cardType);
        // 合同号
        dataRowPayment.addAttribute("TRAN_NO", tranNo);
        // 支付类别
        dataRowPayment.addAttribute("MONEY_TYPE", moneyType);
        // 流水号
        dataRowPayment.addAttribute("STREAM_NO", streamNo);
        // 批次号
        dataRowPayment.addAttribute("BATCH_CODE", batchCode);
        // 授权码
        dataRowPayment.addAttribute("AUTHORIZATION_CODE", authorizationCode);
        // 终端编号
        dataRowPayment.addAttribute("TERMINAL_NUMBER", terminalNumber);
        // 银行编码
        dataRowPayment.addAttribute("BANK_CODE", bankCode);
        // 银行名称
        dataRowPayment.addAttribute("BANK_NAME", bankName);
        // 参考号
        dataRowPayment.addAttribute("REFERENCE", reference);

        return document.asXML();
    }

    /**
     * 接收：HIS返回的XML数据并转换为JSON（HIS==》微信前端）
     * @param resMsg
     * @return
     * @throws Exception
     */
    @Override
    public Map<String, Object> toResultMessage(String resMsg) throws Exception {
        Map<String, Object> resMap = new HashMap<>(16);
        Document document = DocumentHelper.parseText(resMsg);

        Element resultInfo = document.getRootElement().element("Result").element("Info");
        String executeStatus = resultInfo.attributeValue("EXECUTE_STATUS");
        String executeMessage = resultInfo.attributeValue("EXECUTE_MESSAGE");
        List<Map<String, Object>> dataList = new ArrayList<>();

        if (Dialect.getSuccessfulState().equals(executeStatus)) {
            // 获取各个参数的值（出参的树状结构：父==》子）
            Element dataRow = document.getRootElement().element("ReturnData").element("Data").element("DataRow");

            if (dataRow == null) {
                resMap.put("code", "1403");
                resMap.put("message", "调用成功，但是获取的数据为 0 件！");
            } else {
                DoPrePaymentsInnerMessage innerMessage = new DoPrePaymentsInnerMessage(dataRow);

                // 内部交易
                resMap.put("rcptNo", innerMessage.getRcptNo());

                // 身份证号：Log 输出用
                resMap.put("idNo", idNo);
                // 缴费金额：Log 输出用
                resMap.put("amount", amount);
                // 微信公众号注册手机号：Log 输出用
                resMap.put("wxUserMobile", wxUserMobile);
                // 患者姓名：Log 输出用
                resMap.put("patientName", patientName);
                // 患者ID：Log 输出用
                resMap.put("patientId", patientId);
                // 流水号：Log 输出用
                resMap.put("streamNo", streamNo);
                // 住院号：Log 输出用
                resMap.put("inpNo", inpNo);

                // 返回Code
                resMap.put("code", executeStatus);
                // 返回信息
                resMap.put("message", "成功！");

                // 微信消息推送
                WeiChatSendMsg wxMsg = new WeiChatSendMsg();
                wxMsg.sendMsgDoPrePayments(wxUserMobile, patientName, inpNo, amount);
            }
        } else {
            resMap.put("code", executeStatus);
            resMap.put("message", executeMessage);
        }
        return resMap;
    }

    public class DoPrePaymentsInnerMessage implements InnerMessage{
        /**
         * 内部交易
         */
        private String rcptNo;


        public DoPrePaymentsInnerMessage(Element element) {
            // 内部交易
            this.rcptNo = element.attributeValue("RCPT_NO");
        }

        /**
         * 内部交易
         */
        public String getRcptNo() {
            return rcptNo;
        }

    }
}
